﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using MDK;
using MDK.Physics;
using ZedGraph;

namespace ModuleTemplate1
{
    public class SomePhysicsClass : GraphicPrimitive
    {
        #region Конструкторы
        public SomePhysicsClass()
            : base(0, 0, new Size())
        {
            this.Needs = ExperimentNeeds.Graph;
            AddParametersToTemplate();
        }

        public SomePhysicsClass(int Left, int Top, Size Size)
            : base(Left, Top, Size)
        {
            this.Needs = ExperimentNeeds.Graph; // нужды

            // передаём размеры
            this.Left = Left;
            this.Top = Top;

            this.Size = Size;

            //создаём список по умолчанию
            AddParametersToTemplate();
        }
        #endregion

        #region Методы взаимодействия с главным модулем

        public override void SetGraphInfo(GraphPane pane)
        {
            pane.Title.Text = "sigma(E)";

            pane.XAxis.Title.Text = "E";
            pane.YAxis.Title.Text = "sigma";
        }



        /// <summary>
        /// Метод для возвращения описания эксперимента.
        /// </summary>
        /// <returns>Возвращаемый объект содержит краткое имя модуля(чаще имя класса), полное название эксперимента и его описание</returns>
        public override ExperimentAbout GetAbout()
        {
            return new ExperimentAbout("Breit-Wigner", "Построение резонансной кривой", "Построение графика резонанса по формуле Брейта-Вигнера. Резонанс происходит при энергии Er, ширина пика Г, а максимальная энергия - Emax.");
        }

        private void AddParametersToTemplate()
        {
            ParameterListTemplate = new ParameterList();

            // TODO: добавляйте ваши параметры тут.
            ParameterListTemplate.Add("Ширина пика", "Г", 300.0);
            ParameterListTemplate.Add("Резонансная энергия", "Er", 1000.0);
            ParameterListTemplate.Add("Максимальная энергия", "Emax", 2000.0);
        }

        public override void SetParameters(ParameterList pList)
        {
            G = pList["Г"];
            Er = pList["Er"];
            eMax = pList["Emax"];
        }


        public override ParameterList GetParameters()
        {
            ParameterList RetList = ParameterListTemplate;

            RetList["Г"] = G;
            RetList["Er"] = Er;
            RetList["Emax"] = eMax;

            return RetList;
        }

        #endregion


        double G = 0;
        double Er = 0;
        double eMax = 0;

        double S(double E)
        {
            double g = G * G / 4;

            double gPart = g / ((E - Er) * (E - Er) + g);

            return (2 * Math.PI * gPart);
        }

        public override PointPairList GetPoints()
        {
            PointPairList points = new PointPairList();

            for (double e = 0; e < eMax; e++)
            {
                points.Add(e, S(e));
            }

            return points;
        }

        /// <summary>
        /// Метод рисования
        /// </summary>
        /// <param name="e"></param>
        public override void Draw(System.Windows.Forms.PaintEventArgs e)
        {
            //Ваше рисование здесь!
        }

    }
}
